﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;

namespace Sem3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("-----------------------------------------------");
            //calculateScore(10);
            CalculateRowsAndSeatsScore(9, 5, 9, true);
            Console.WriteLine("-----------------------------------------------");

            Console.ReadKey();
        }

        private static void CalculateRowsAndSeatsScore(int rows, int preferedRow, int seatsInRow, Boolean doCalcTest)
        {
            foreach (int rowScore in CalculateScorePerRow(rows, preferedRow))
            {
                string seats = "";
                foreach (int seatScore in CalculateScorePerSeatInRow(seatsInRow))
                {
                    if (doCalcTest)
                    {
                        int result = seatScore + rowScore;
                        seats += DoFormat(result);
                    }
                    else
                    {
                        seats += DoFormat(seatScore);
                    }
                }


                Console.WriteLine("  {0}", seats);
            }
        }

        static string DoFormat(int number)
        {
            string returnString = "";
            string formatString = "";

            if (number > 9)
            {
                formatString = " {0}";
            }
            else
            {
                formatString = " {0} ";
            }

            returnString = String.Format(formatString, number);

            return returnString;
        }

        static List<int> CalculateScorePerRow(int numRows, int preferredRow)
        {
            List<int> rowsList = new List<int>();

            double theCenter = numRows / 2;
            int theCenter2 = (int)Math.Ceiling(theCenter);

            int outputInt = 0;

            if (preferredRow == 0)
            {

                int x = numRows;
                for (int i = 1; i <= numRows; i++)
                {
                    if (i <= theCenter2)
                    {
                        outputInt = i; // 1 og 2
                    }
                    else
                    {
                        outputInt = x; // 8, 7, 6, 5, 4, 3, 2, 1
                    }

                    rowsList.Add(outputInt);

                    x--;
                }

            }
            else
            {
                // Vi har 10 rækker (rows)
                int rows = numRows;
                // Vores fortrukne række er 2 (prefRow)
                int prefRow = preferredRow;

                // (rows)10 minus 1 - for at give det nummer vi går ud fra
                int maxScore = rows - 1;
                // (prefRow)5-1 - antallet af rækker vi skal have før række 5
                int numbersOfRowsBeforeTheRowWeGoOutFrom = prefRow - 1;
                // (rows)10-(prefRow)5 - antallet af rækker der skal være efter
                int numbersOfRowsAfterTheRowWeGoOutFrom = rows - prefRow;


                rowsList.Add(maxScore); // Tilføjer først den miderste linje. Altså den hvor scoren er højest, vores preferredRow

                // I dette for-loop tilføjer vi alle "rows"/rækkerne som kommer efter vores preferredRow
                for (int i = 1; i <= numbersOfRowsAfterTheRowWeGoOutFrom; i++)
                {
                    rowsList.Add(maxScore - i);
                }

                // I dette for-loop nr. 2, der løber vi de første "rows"/rækker igennem. Disse bliver smidt ind i starten af array'et
                for (int i = 1; i <= numbersOfRowsBeforeTheRowWeGoOutFrom; i++)
                {
                    rowsList.Insert(0, maxScore - i);//maxScore-xTry);
                }


                //////////////////////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////
                ///////////////////////////////////  Tidligere noter!  ///////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////////////////////////


                // Vi har 10 rækker
                // Vores fortrukne række er 2
                //#1   8
                //#2   9 --
                //#3   8
                //#4   7
                //#5   6
                //#6   5
                //#7   4
                //#8   3
                //#9   2
                //#10  1

                // Vi har 10 rækker (rows)
                // Vores fortrukne række er 5 (prefRow)

                // (rows)10 minus 1 - for at give det nummer vi går ud fra
                // (prefRow)5-1 - antallet af rækker vi skal have før række 5
                // (rows)10-(prefRow)5 - antallet af rækker der skal være efter

                //#1   5
                //#2   6
                //#3   7
                //#4   8
                //#5   9 --
                //#6   8
                //#7   7
                //#8   6
                //#9   5
                //#10  4


            }

            return rowsList;
        }

        static List<int> CalculateScorePerSeatInRow(int spr)
        {
            int sprResult = spr / 2;
            List<int> output = new List<int>();

            int x = spr;
            int outputInt = 0;

            for (int i = 1; i <= spr; i++)
            {
                if (i <= sprResult)
                {
                    outputInt = i;
                }
                else
                {
                    outputInt = x;
                }

                output.Add(outputInt);

                x--;
            }

            return output;
        }
    }
}